const ERROR_STATUS = {
  400: '400: 请求出现语法错误',
  401: '401: 用户未授权',
  403: '403: 服务器拒绝访问',
  404: '404: 请求资源不存在',
  405: '405: 请求方法不允许',
  408: '408: 网络请求超时',
  500: '500: 服务器内部错误',
  501: '501: 服务器未实现请求功能',
  502: '502: 错误网关',
  503: '503: 服务不可用',
  504: '504: 网关超时',
  505: '505: http 版本不支持该请求',
} as const // 只有用了 as const，才能将其中的内容用于创建类型

// 将对象的 value 定义为新的类型
// type ERRORMSG = (typeof ERROR_STATUS)[keyof typeof ERROR_STATUS]
// 将对象的 key 定义为新的类型
type ERRORSTATUS = keyof typeof ERROR_STATUS

/**
 * 网络请求错误状态处理
 */
export function errorHandler(error: any) {
  const message = window.$message
  if (error.response) {
    const status = error.response.status as ERRORSTATUS
    message?.error(ERROR_STATUS[status])
    return
  }
  if (error.code === 'ECONNABORTED' && error.message.inclueds('timeout')) {
    message?.error('网络连接超时')
    return
  }
  if (!window.navigator.onLine || error.message === 'Network Error') {
    message?.error('网络不可用')
    return
  }
  message?.error('请求错误')
}

/**
 * 该函数返回的函数用于处理请求错误，因为请求错误可能是连续的，多个错误间需要有间隔
 * @param duration 多个异常提示的间隔时间
 * @returns
 */
export function continuousErrorHandler(duration: number) {
  // errorStacks 为闭包内的变量
  let errorStacks: string[] = []
  function pushError(id: string) {
    errorStacks.push(id)
  }
  function removeError(id: string) {
    errorStacks = errorStacks.filter((t) => t !== id)
  }
  function handleError(id: string, callback: () => void) {
    callback()
    setTimeout(() => {
      removeError(id)
    }, duration)
  }
  function handleContinousError(callback: () => void) {
    // toString(36)表示将其转换为 36 进制的值(10数字+26小写字母)
    const id = Date.now().toString(36)
    const length = errorStacks.length
    if (length > 0) {
      pushError(id)
      setTimeout(() => handleError(id, callback), length * duration)
    } else {
      pushError(id)
      handleError(id, callback)
    }
  }
  return handleContinousError
}
